﻿Namespace SchoolClick.Controllers
    Public Class PeriodosController
        Inherits AuthorizeBaseController

        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Periodos_Eva() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_status_periodo_ae() As ActionResult
            Dim db As New SchoolClickDAL

            'Primero, comprobamos si nos encontramos en la creacion de nuevo año escolar
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Titulo = "No existe ningún año escolar actualmente activo, ya que se está creando uno."
                ViewBag.Mensaje = "El año escolar en estos momentos se encuentra en <b>MODO DE CREACIÓN</b>, lo cual significa que es esta configurando un nuevo año escolar para el sistema. <br /> Mientras se mantenga el estado de creación, la apertura o cierres de periodos estará deshabilitada."
                Return PartialView("_error_page_for_year_custom")
            End If

            'Como estamos seguros que el año escolar no se encuentra en MODO CREACION, obtenemos el Status del Año
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            If Not statusAE.IS_CLOSE Then       'Si el año escolar se encuentra activo
                If Not IsNothing(statusAE.PERIODO_ACTIVO) Then      'Existe un periodo que se encuentra activo en estos momentos
                    Return PartialView("_info_periodo_evaluativo", db.IAñoEscolar.GetPeriodoEvaluativoActivo)
                End If

                'Como no hay ningun periodo activo, verificamos si ya fueron CERRADOS todos los periodos
                If IsNothing(statusAE.NEXT_PERIODO_OPEN) Then       'Ya no hay mas periodos que se puedan abrir, por lo tanto hay que cerrar el AE
                    ViewBag.Titulo = "Los periodos evaluativos del año escolar se han terminado"
                    ViewBag.Mensaje = String.Format("En estos momentos, ya no existen mas periodos evaluativos que se puedan abrir para el año escolar {0}.<br />El siguiente periodo, es el <b>PERIODO DE RECUPERACIÓN</b>, en el cual se habilitará el ingreso de las notas a los alumnos que cumplan con los requisitos para poder realizar el examen de recuperación de las materias que hayan reprobado.<br /><br /><a id=""link-open-recuperacion"" href=""/Periodos/_action_close_anio_escolar"">¿Desea activar en estos momentos el Periodo de Recuperación del año escolar {0}?</a>", statusAE.ANIO_ESCOLAR)
                    Return PartialView("_error_page_for_year_custom")
                End If

                'Todavia existen periodos en el año escolar que se deban abrir
                ViewBag.Periodo = statusAE.NEXT_PERIODO_OPEN
                ViewBag.Titulo = String.Format("Apertura del Periodo Evaluativo No. {0}", statusAE.NEXT_PERIODO_OPEN.Substring(1))
                ViewBag.Mensaje = String.Format("En estos momentos, no existe ningún periodo evaluativo abierto en el sistema.<br />Para poder permitir a los profesores del instituto definir las actividades de evaluación en cada una de sus materias que imparten y el ingreso de la notas, primero deberá abrirse el periodo evaluativo.<br /><br /><a href=""/Periodos/_dialog_apertura_periodo_ae"" id=""link-open-periodo"">¿Desea abrir en estos momentos el Periodo Evaluativo No. {0}?</a>", statusAE.NEXT_PERIODO_OPEN.Substring(1))
                Return PartialView("_apertura_periodo_evaluativo_ae")
            Else 'Si el año escolar ya fue cerrado
                If Not statusAE.IS_RECUPERACION_CLOSE Then      'Estamos en el periodo de recuperacion
                    ViewBag.Titulo = String.Format("El Periodo de Recuperación año {0} esta activo", statusAE.ANIO_ESCOLAR)
                    ViewBag.Mensaje = "El año escolar ya ha sido cerrado; Por lo tanto, en estos momentos el sistema se encuentra en el <b>PERIODO DE RECUPERACIÓN</b>.<br /> Durante este periodo, usted podrá ingresar las notas de los alumnos que calificaron para el periodo de recuperación según el instructivo del MINED.<br /> <br />Si desea dar por finalizado el Periodo de Recuperación y pasar al <b>PERIODO DE RECUPERACIÓN EXTRA</b> <i>(solo para bachillerato de promoción)</i>, deberá terminar este periodo.<br /><br /><a id=""link-close-recuperacion"" href=""/Periodos/_action_close_periodo_recuperacion"">¿Desea en estos momentos, dar por finalizado el Periodo de Recuperación?</a>"
                    Return PartialView("_error_page_for_year_custom")
                ElseIf Not statusAE.IS_RECUPERACION_XTRA_CLOSE Then
                    ViewBag.Titulo = String.Format("El Periodo de Recuperación Extraordinario del Año {0} esta Activo", statusAE.ANIO_ESCOLAR)
                    ViewBag.Mensaje = "Actualmente, el sistema se encuentra en el <b>PERIODO DE RECUPERACIÓN EXTRAORDINARIO</b>, el cual es un periodo UNICAMENTE para los alumnos de 2° General y 3° Técnico.<br />Durante este periodo, usted puede obtener el listado de alumnos que califican para este periodo y a su vez, el ingreso de la nota para este periodo.<br /><br />Si desea iniciar un nuevo año escolar en el sistema, primero deberá finalizar este periodo. <br /><br /><a href=""/Periodos/_action_close_periodo_recuperacion_extraordinario"" id=""link-close-xtra-recuperacion"">¿Desea finalizar en este momento el Periodo de Recuperación Extraordinario?</a>"
                    Return PartialView("_error_page_for_year_custom")
                End If
            End If

            'Significa que el Año Escolar ha sido finalizado con todos sus periodos
            ViewBag.Titulo = String.Format("El Año Escolar {0} ha finalizado", statusAE.ANIO_ESCOLAR)
            ViewBag.Mensaje = "Se han completado todos los Periodos Evaluativos del año escolar y los periodos de recuperación a los que tiene derecho el estudiante.<br />Ahora se encuentra listo para poder empezar a crear y configurar el año escolar para el próximo año."
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _dialog_apertura_periodo_ae() As ActionResult
            Dim db As New SchoolClickDAL
            Dim status = db.IAñoEscolar.GetStatusAñoEscolar
            Return PartialView(New InfoPeriodoEvaluativoAE With {
                               .AñoEscolar = status.ANIO_ESCOLAR,
                               .Periodo = status.NEXT_PERIODO_OPEN,
                               .FechaCierre = Date.Now.AddMonths(2)
                           })
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _action_open_periodo_eva_ae(model As InfoPeriodoEvaluativoAE) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.OpenPeriodo(model.FechaCierre, model.HoraCierre)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El periodo evaluativo se ha abierto correctamente en el sistema. Ahora los profesores podrán empezar a definir sus actividades evaluativas y el ingreso de notas de las mismas.",
                                                                   titulo:="¡Se ha abierto correctamente el periodo!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Open)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _action_close_periodo_eva_ae() As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.ClosePeriodo()
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El periodo evaluativo se ha cerrado correctamente en el sistema y se han calculado los promedios del periodo. Ahora, puede descargar los listados de alumnos con todas sus notas para poder ser ingresada en el SIRAI.",
                                                                   titulo:="¡Se ha cerrado correctamente el periodo!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _action_close_anio_escolar() As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.CloseAnioEscolar()
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El año escolar activo del sistema se ha cerrado correctamente. Los promedios finales de cada uno de los alumnos han sido calculados y pueden ser vistos desde el sitio web.  Además, en estos momentos se habilitó la descarga del listado de alumnos que cumplen los requisitos del MINED para el Periodo de Recuperación.",
                                                                   titulo:="¡Se ha cerrado correctamente el año escolar!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _action_close_periodo_recuperacion() As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.ClosePeriodoRecuperacion()
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El Periodo de Recuperación se ha cerrado correctamente en el sistema. A partir de este momento, queda habilitado el Periodo de Recuperación Extraordinario, el cual es UNICAMENTE para los alumnos de 2° General y 3° Técnico.",
                                                                   titulo:="¡Se ha cerrado correctamente el Periodo de Recuperación!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _action_close_periodo_recuperacion_extraordinario() As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.ClosePeriodoRecuperacionXtra()
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El Periodo de Recuperación Extraordinario se ha cerrado correctamente en el sistema. En estos momentos, el sistema se encuentra listo para empezar a configurar el nuevo año escolar para el próximo año.",
                                                                   titulo:="¡Se ha cerrado correctamente el Periodo de Recuperación Extraordinario!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function

#Region "Metodos para 'OBTENER EL LISTADO DE ALUMNOS PERIODO RECUPERACION'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function PRecuperacion() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_PRecuperacion() As ActionResult
            Dim db As New SchoolClickDAL
            Dim status = db.IAñoEscolar.GetStatusAñoEscolar

            If status.IS_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_CLOSE.Equals(False) Then
                ViewBag.Año = status.ANIO_ESCOLAR
                Return PartialView("_list_alumnos_periodo_recuperacion")
            End If

            ViewBag.Titulo = "El Periodo de Recuperación en el sistema NO se encuentra Activo"
            ViewBag.Mensaje = String.Format("Es estos momentos no se puede obtener el listado de alumnos que califican al Periodo de Recuperación {0}.<br />Esto puede deberse a las siguientes razones:<br />- Se esta creando un nuevo año escolar. <br />- Existe un Periodo Evaluativo activo en el sistema. <br />- Todavía no ha sido cerrado el Año Escolar {0} para poder pasar al Periodo de Recuperación {0}.", status.ANIO_ESCOLAR)
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_alumnos_calificados_pr(request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of ALUMNOS_PERIODO_RECUPERACION) = db.IAlumnos.GetAlumnosPeriodoRecuperacion(statusAE.ANIO_ESCOLAR) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.GetAlumnosPeriodoRecuperacion(statusAE.ANIO_ESCOLAR).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
            .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.jqGrid_MASTER_LIST_ALUMNOS_PR)(p.ID_ALUMNO,
                                                                New jqGrid.jqGrid_MASTER_LIST_ALUMNOS_PR With {
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE,
                                                                        .Grado = p.TITULO_GRADO,
                                                                        .NoMateriasDejadas = p.NO_MATERIAS_DEJO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_detail_alumnos_calificados_pr(id As String, Anio As String) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of ALUMNOS_PERIODOS_RECUPERACION_DETAILS) = db.IAlumnos.GetDetailsAlumnosPeriodoRecuperacion(id, Anio),
                response As New JqGridResponse()

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.jqGRID_DETAIL_LIST_ALUMNOS_PR)(p.ID,
                                                                New jqGrid.jqGRID_DETAIL_LIST_ALUMNOS_PR With {
                                                                        .Materia = p.MATERIA,
                                                                        .Matricula = p.MATRICULA,
                                                                        .P1 = p.P1,
                                                                        .P2 = p.P2,
                                                                        .P3 = p.P3,
                                                                        .P4 = p.P4,
                                                                        .PROM_APROX = p.PROMEDIO_APROX,
                                                                        .PROM_REAL = p.PROMEDIO_REAL
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function
#End Region

#Region "Metodos para 'INGRESO DE NOTAS PARA PERIODO DE RECUPERACION'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function Ingreso_Notas_PR() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_ingreso_notas_PRecuperacion() As ActionResult
            Dim db As New SchoolClickDAL
            Dim status = db.IAñoEscolar.GetStatusAñoEscolar

            If status.IS_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_CLOSE.Equals(False) Then
                ViewBag.Año = status.ANIO_ESCOLAR
                Return PartialView("_ingreso_notas_periodo_recuperacion")
            End If

            ViewBag.Titulo = "El Periodo de Recuperación en el sistema NO se encuentra Activo"
            ViewBag.Mensaje = String.Format("Es estos momentos no se puede realizar el ingreso de notas para los alumnos que califican al Periodo de Recuperación {0}.<br />Esto puede deberse a las siguientes razones:<br />- Se esta creando un nuevo año escolar. <br />- Existe un Periodo Evaluativo activo en el sistema. <br />- Todavía no ha sido cerrado el Año Escolar {0} para poder pasar al Periodo de Recuperación {0}.", status.ANIO_ESCOLAR)
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_alumnos_ingreso_notas_pr(Grado As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of NOTAS_ALUMNOS_PR_BYGRADO) = db.IAlumnos.GetNotasAlumnosPRByGrado(statusAE.ANIO_ESCOLAR, Grado) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.GetNotasAlumnosPRByGrado(statusAE.ANIO_ESCOLAR, Grado).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
            .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA)(String.Format("{0}-{1}-{2}", p.ID_ALUMNO, p.MATRICULA, p.ID_IMPARTE),
                                                                New jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA With {
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE,
                                                                        .Grado = p.TITULO_GRADO,
                                                                        .Materia = p.MATERIA,
                                                                        .Nota = p.NOTA_REPO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Function _save_nota_periodo_recuperacion(id As String, Nota As Decimal) As JsonResult
            Dim db As New SchoolClickDAL
            Try
                db.IAlumnos.SaveNotaAlumnoPeriodoRecuperacion(id, Nota)
                Return Json(True)
            Catch ex As Exception
                HttpContext.Response.StatusCode = 500
                HttpContext.Response.TrySkipIisCustomErrors = True
                Return Json(ex.Message)
            End Try
        End Function
#End Region

#Region "Metodos para 'OBTENER EL LISTADO DE ALUMNOS PERIODO RECUPERACION EXTRAORDINARIO'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function PRecuperacion_Xtra() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_PRecuperacion_Xtra() As ActionResult
            Dim db As New SchoolClickDAL
            Dim status = db.IAñoEscolar.GetStatusAñoEscolar

            If status.IS_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_XTRA_CLOSE.Equals(False) Then
                ViewBag.Año = status.ANIO_ESCOLAR
                Return PartialView("_list_alumnos_periodo_recuperacion_xtra")
            End If

            ViewBag.Titulo = "El Periodo de Recuperación Extraordinario NO se encuentra Activo"
            ViewBag.Mensaje = String.Format("Es estos momentos no se puede obtener el listado de alumnos que califican al Periodo de Recuperación Extraordinario {0}.<br />Esto puede deberse a las siguientes razones:<br />- Se esta creando un nuevo año escolar. <br />- Existe un Periodo Evaluativo activo en el sistema. <br />- Todavía no ha sido cerrado el Año Escolar {0}.<br />- Todavía no ha sido cerrado el Periodo de Recuperación para poder pasar al Periodo de Recuperación Extraordinario {0}.", status.ANIO_ESCOLAR)
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_alumnos_calificados_pr_extra(request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of ALUMNOS_PERIODO_RECUPERACION_XTRA) = db.IAlumnos.GetAlumnosPeriodoRecuperacionXtra(statusAE.ANIO_ESCOLAR) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.GetAlumnosPeriodoRecuperacionXtra(statusAE.ANIO_ESCOLAR).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
            .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.jqGrid_MASTER_LIST_ALUMNOS_PRE)(p.ID_ALUMNO,
                                                                New jqGrid.jqGrid_MASTER_LIST_ALUMNOS_PRE With {
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE,
                                                                        .Grado = p.TITULO_GRADO,
                                                                        .Materia = p.MATERIA,
                                                                        .Matricula = p.MATRICULA,
                                                                        .PROM_REPO_APROX = p.PROM_REPO_APROX,
                                                                        .PROM_REPO_REAL = p.PROM_REPO_REAL
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function
#End Region

#Region "Metodos para 'INGRESO DE LAS NOTAS PARA EL PERIODO RECUPERACION EXTRAORDINARIO'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function Ingreso_Notas_PRE() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_ingreso_notas_PRecuperacionXtra() As ActionResult
            Dim db As New SchoolClickDAL
            Dim status = db.IAñoEscolar.GetStatusAñoEscolar

            If status.IS_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_CLOSE.Equals(True) AndAlso status.IS_RECUPERACION_XTRA_CLOSE.Equals(False) Then
                ViewBag.Año = status.ANIO_ESCOLAR
                Return PartialView("_ingreso_notas_periodo_recuperacion")
            End If

            ViewBag.Titulo = "El Periodo de Recuperación Extraordinario NO se encuentra Activo"
            ViewBag.Mensaje = String.Format("Es estos momentos no se puede obtener el listado de alumnos que califican al Periodo de Recuperación Extraordinario {0}.<br />Esto puede deberse a las siguientes razones:<br />- Se esta creando un nuevo año escolar. <br />- Existe un Periodo Evaluativo activo en el sistema. <br />- Todavía no ha sido cerrado el Año Escolar {0}.<br />- Todavía no ha sido cerrado el Periodo de Recuperación para poder pasar al Periodo de Recuperación Extraordinario {0}.", status.ANIO_ESCOLAR)
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_alumnos_ingreso_notas_pre(Grado As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of NOTAS_ALUMNOS_PRE_BYGRADO) = db.IAlumnos.GetNotasAlumnosPREByGrado(statusAE.ANIO_ESCOLAR, Grado) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.GetNotasAlumnosPREByGrado(statusAE.ANIO_ESCOLAR, Grado).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
            .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA)(String.Format("{0}-{1}-{2}", p.ID_ALUMNO, p.MATRICULA, p.ID_IMPARTE),
                                                                New jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA With {
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE,
                                                                        .Grado = p.TITULO_GRADO,
                                                                        .Materia = p.MATERIA,
                                                                        .Nota = p.NOTA_EXTRA_REPO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Function _save_nota_periodo_recuperacion_xtra(id As String, Nota As Decimal) As JsonResult
            Dim db As New SchoolClickDAL
            Try
                db.IAlumnos.SaveNotaAlumnoPeriodoRecuperacionXtra(id, Nota)
                Return Json(True)
            Catch ex As Exception
                HttpContext.Response.StatusCode = 500
                HttpContext.Response.TrySkipIisCustomErrors = True
                Return Json(ex.Message)
            End Try
        End Function
#End Region

#Region "Metodos para 'OBTENER LOS REPORTES DE LAS NOTAS DE UN PERIODO ESPECIFICO PARA EL 'SIRAI''"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function NotaForSIRAI() As ActionResult
            Return View()
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getPeriodosClose_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IAñoEscolar.GetPeriodosClose.OrderByDescending(Function(p) p.ANIO_ESCOLAR) _
                                        .ThenByDescending(Function(p) p.PERIODO1) _
                                        .Select(Function(p) New SelectListItem With {.Text = String.Format("Periodo No. {0} - {1}", p.PERIODO1.Substring(1), p.ANIO_ESCOLAR),
                                                                                      .Value = p.ID_PERIODO
                                                                                     }).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function
#End Region
    End Class
End Namespace
